// 第一种泛型使用方式,可以自定义传入参数类型
function fn<T>(a: T): T {
	return a;
}
console.log(fn('10')); // 不指定泛型类型
console.log(fn<number>(20)); // 指定泛型类型

// 第二种
function fn1<T, K>(a: T, b: K): T {
	console.log(b);
	return a;
}
console.log(fn1<number, string>(20, '10')); // 指定泛型类型

// 第三种指定泛型类型为自定义接口类型
interface Inter {
	length: number;
}
function fn2<T extends Inter>(a: T): number {
	return a.length;
}
class num implements Inter {
	length: number = 999;
}
let numObj = new num();
console.log(fn2(numObj)); // 指定泛型类型

// 第四种类式泛型
class myClass<T> {
	name: T;
	constructor(name: T) {
		this.name = name;
	}
}
console.log(new myClass<String>("张三"));

